


#include <iostream>
using namespace std;

//void test(void)
//{
//	int b = 0;
//
//	cout << "&b = " << & b << endl << endl;
//}
//
//void ptest(void)
//{
//	int* pb = (int*)malloc(sizeof(int) * 27);
//	cout << "pb = " << pb << endl;
//}
//
//int main()
//{
//	/*int a = 0;
//	cout << "&a = " << & a << endl;
//
//	test();
//
//	int* pa = (int*)malloc(sizeof(int) * 27);
//	cout << "pa = " << pa << endl;
//
//	ptest();*/
//
//	int i = 1;
//	while (1)
//	{
//		char* p = new char[1024 * 1024 * 1024];
//		printf("%d	%p\n", i++, p);
//	}
//
//	return 0;

//
//class A
//{
//public:
//	A(int a = 1)
//		:_a(a)
//	{}
//
//	~A()
//	{
//		_a = 0;
//	}
//
//private:
//	int _a;
//};
//
//class B
//{
//public:
//	B(int b = 2)
//		:_b(b)
//	{}
//
//private:
//	int _b;
//};
//
//int main()
//{
//	B* pb = new B[10];
//	delete pb;
//
//	A* pa = new A[10];
//	delete pa;
//
//	char* pc = new char[100];
//	delete pc;
//
//
//	return 0;
//}
//

//#include <assert.h>
//int main()
//{
//	int* ptr1 = (int*)calloc(4, sizeof(int));
//	assert(ptr1);
//	cout << ptr1 << endl;
//
//	int* ptr2 = (int*)realloc(ptr1, sizeof(int)*4);
//	assert(ptr2);
//	cout << ptr2 << endl;
//  free(ptr2);
//
//
//	return 0;
//}

//#include <assert.h>
//void func(int* p, int n)
//{
//	for (int i = 0; i < 4; ++i)
//	{
//		p[i] = i * i;
//		printf("p%d[%d] = %d	", n, i, p[i]);
//	}
//
//	cout << endl;
//	free(p);
//	p = nullptr;
//}
//
//int main()
//{
//	int* p1 = (int*)malloc(sizeof(int) * 4);
//	int* p2 = (int*)malloc(sizeof(int[4]));
//	int* p3 = (int*)malloc(4 * sizeof*p3);
//
//	assert(p1 && p2 && p3);
//
//	func(p1, 1);
//	func(p2, 2);
//	func(p3, 3);
//
//	return 0;
//}


//int main()
//{
//	/*int* p1 = (int*)malloc(sizeof(int) * 10);
//	free(p1);*/
//
//	int* p1 = (int*)calloc(4, sizeof(int));
//	int* p2 = (int*)calloc(1, sizeof(int[4]));
//	int* p3 = (int*)calloc(4, sizeof * p3);
//
//	free(p1);
//	free(p2);
//	free(p3);
//
//	int* p4 = (int*)realloc(nullptr, 0);
//	if (p4)
//	{
//		cout << p4 << endl;
//	}
//
//	return 0;
//}

// .c
//#include <stdio.h>
//#include <assert.h>
//#include <string.h>
//#include <stdlib.h>
//void print(const int* next, const int* prev, int ints)
//{
//	if (next)
//	{
//		printf("%s location: %p. Size: %d ints (%ld bytes).\n",
//			(next != prev ? "new" : "old"), next, ints, ints * sizeof(int));
//	}
//	else
//		printf("Allocation failed.\n");
//}
//
//int main()
//{
//	const int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
//	const int sz = sizeof arr / sizeof(int);
//	int* next = NULL, * prev = NULL;
//
//	if ((next = (int*)malloc(sz * sizeof(*next))))
//	{
//		memcpy(next, arr, sizeof arr);
//		print(next, prev, sz);
//	}
//	else
//		return EXIT_FAILURE;
//
//	const int realloc_size[] = { 10, 12, 512, 32768, 65536, 32768 };
//	for (int i = 0; i != sizeof realloc_size / sizeof(int); ++i)
//	{
//		if ((next = (int*)realloc(prev = next, realloc_size[i] * sizeof(int))))
//		{
//			print(next, prev, realloc_size[i]);
//			assert(!memcmp(next, prev, sizeof arr));
//		}
//		else
//		{
//			free(prev);
//			prev = NULL;
//			return EXIT_FAILURE;
//		}
//	}
//
//
//	free(next);
//	next = NULL;
//
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//int main()
//{
//	int* p = (int*)malloc(sizeof(*p));
//	free(p);
//	p = NULL;
//
//	free(p);
//
//	return 0;
//}


//template <class T>
template <typename T>
T add(const T& a, const T& b)
{
	return a + b;
}

int add(int a, int b)
{
	return a + b;
}

int main()
{
	int a1 = 1, a2 = 2;
	double d1 = 1.1, d2 = 2.2;

	cout << add(a1, a2) << endl;
	cout << add(d1, d2) << endl << endl;

	cout << add(a1, (int)d1) << endl;
	cout << add<double>(a1, d1) << endl;
	cout << add<int>(a2, d2) << endl;

	return 0;
}